using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._SpatialAnalystTools._Multivariate
{
    /// <summary>
    /// <para>Iso Cluster Unsupervised Classification</para>
    /// <para>Performs unsupervised classification on a series of input raster bands using the Iso Cluster and Maximum Likelihood Classification tools.</para>
    /// <para>使用 Iso 聚类和最大似然分类工具对一系列输入栅格波段执行无监督分类。</para>
    /// </summary>    
    [DisplayName("Iso Cluster Unsupervised Classification")]
    public class IsoClusterUnsupervisedClassification : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public IsoClusterUnsupervisedClassification()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_Input_raster_bands">
        /// <para>Input raster bands</para>
        /// <para><xdoc>
        ///   <para>The input raster bands.</para>
        ///   <para>They can be integer or floating point type.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>输入栅格波段。</para>
        ///   <para>它们可以是整数类型或浮点类型。</para>
        /// </xdoc></para>
        /// </param>
        /// <param name="_Number_of_classes">
        /// <para>Number of classes</para>
        /// <para>Number of classes into which to group the cells.</para>
        /// <para>要将单元格分组到的类数。</para>
        /// </param>
        /// <param name="_Output_classified_raster">
        /// <para>Output classified raster</para>
        /// <para>The output classified raster.</para>
        /// <para>输出分类栅格。</para>
        /// </param>
        public IsoClusterUnsupervisedClassification(List<object> _Input_raster_bands, long? _Number_of_classes, object _Output_classified_raster)
        {
            this._Input_raster_bands = _Input_raster_bands;
            this._Number_of_classes = _Number_of_classes;
            this._Output_classified_raster = _Output_classified_raster;
        }
        public override string ToolboxName => "Spatial Analyst Tools";

        public override string ToolName => "Iso Cluster Unsupervised Classification";

        public override string CallName => "sa.IsoClusterUnsupervisedClassification";

        public override List<string> AcceptEnvironments => ["autoCommit", "cellSize", "cellSizeProjectionMethod", "compression", "configKeyword", "extent", "geographicTransformations", "mask", "outputCoordinateSystem", "scratchWorkspace", "snapRaster", "tileSize", "workspace"];

        public override object[] ParameterInfo => [_Input_raster_bands, _Number_of_classes, _Output_classified_raster, _Minimum_class_size, _Sample_interval, _Output_signature_file];

        /// <summary>
        /// <para>Input raster bands</para>
        /// <para><xdoc>
        ///   <para>The input raster bands.</para>
        ///   <para>They can be integer or floating point type.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>输入栅格波段。</para>
        ///   <para>它们可以是整数类型或浮点类型。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input raster bands")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public List<object> _Input_raster_bands { get; set; }


        /// <summary>
        /// <para>Number of classes</para>
        /// <para>Number of classes into which to group the cells.</para>
        /// <para>要将单元格分组到的类数。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Number of classes")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public long? _Number_of_classes { get; set; }


        /// <summary>
        /// <para>Output classified raster</para>
        /// <para>The output classified raster.</para>
        /// <para>输出分类栅格。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output classified raster")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _Output_classified_raster { get; set; }


        /// <summary>
        /// <para>Minimum class size</para>
        /// <para><xdoc>
        ///   <para>Minimum number of cells in a valid class.</para>
        ///   <para>The default is 20.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>有效类中的最小单元格数。</para>
        ///   <para>默认值为 20。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Minimum class size")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public long _Minimum_class_size { get; set; } = 20;


        /// <summary>
        /// <para>Sample interval</para>
        /// <para><xdoc>
        ///   <para>The interval to be used for sampling.</para>
        ///   <para>The default is 10.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>用于采样的时间间隔。</para>
        ///   <para>默认值为 10。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Sample interval")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public long _Sample_interval { get; set; } = 10;


        /// <summary>
        /// <para>Output signature file</para>
        /// <para><xdoc>
        ///   <para>The output signature file.</para>
        ///   <para>A .gsg extension must be specified.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>输出签名文件。</para>
        ///   <para>必须指定 .gsg 扩展名。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output signature file")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _Output_signature_file { get; set; } = null;


        public IsoClusterUnsupervisedClassification SetEnv(int? autoCommit = null, object cellSize = null, object compression = null, object configKeyword = null, object extent = null, object geographicTransformations = null, object mask = null, object outputCoordinateSystem = null, object scratchWorkspace = null, object snapRaster = null, double[] tileSize = null, object workspace = null)
        {
            base.SetEnv(autoCommit: autoCommit, cellSize: cellSize, compression: compression, configKeyword: configKeyword, extent: extent, geographicTransformations: geographicTransformations, mask: mask, outputCoordinateSystem: outputCoordinateSystem, scratchWorkspace: scratchWorkspace, snapRaster: snapRaster, tileSize: tileSize, workspace: workspace);
            return this;
        }

    }

}